package com.cskaoyan.javase.oop2.encapsulate._1extends._4hierarchy;

/**
 * 继承层次
 *
 * 我们已经学习过了Java继承的基本语法
 * extends后面跟一个类名，表示子类继承一个父类，那么很自然就会想到一个问题：
 * Java中的一个类，能不能使用extends关键字同时继承多个类呢?
 *
 * 不行,在Java的继承设计中,一个类是不能通过extends关键字直接继承多个父类的
 * 这种语法设计,被称之"单继承"/"单重继承"
 * 也就是说,Java中的一个类,它只能有一个直接父类,不可能有两个直接父类
 *
 * 和C++的多继承比较:
 * Java秉承着简化C++的原则,就没有采取C++中的多继承.
 * 单继承更简单,多继承灵活性更高但是复杂性也更高.
 *
 * 第二个问题:
 * 既然Java采取单继承,那么Java中的一个类,就只有一个父类吗?
 * 不是
 * 因为虽然一个类只能有一个直接父类,但是直接父类还有直接父类
 * 这就是间接父类
 * 直接父类和间接父类都是父类(通俗点说,你既要继承爸爸,也要继承爷爷)
 * 所以Java中的一个类,完全可以有很多个父类
 * 很多类组合起来就能组成一张继承网，称之为继承层次
 *
 * 祖先类：处在继承顶层的类。
 * 继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 * 继承链：从某一个子类开始，到其祖先类的路径。
 *
 * 在继承层次中,要注意以下概念:
 *      1.在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
 *      2.在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 *      3.在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。
 *      4.(重点)不在一条继承链中的两个类,没有任何关系(不讲究血缘关系.)
 *          解释:
 *          a.因为一方面，子类可以自由扩展功能；
 *          b.另一方面，继承来的东西也是可以修改的(方法的重写)。
 *       特别需求注意:
 *          在之前,我们讲过引用数据类型的类型转换
 *          从继承的方向上来说,向上转型是自动类型转换,向下转型是强制类型转换
 *          这里的向下和向下都是针对于同一条继承链中的两个类
 *          也就是说,
 *          只有处在同一条继承链中的两个类,才有可能发生类型转换
 *
 *       5.不能循环定义继承。比如A继承B，B继承C，再让C来继承A，这是不行的。
 *       6.继承链可以无限延伸下去，但是一般来说有个5~6层继承，已经很多了。具体还是根据需求.
 *
 * 补充:
 *      关于Java中的祖先类
 *      在整个Java的继承设计体系中,处在绝对最顶层的祖先类是java.lang.Object类
 *      该类是Java中所有类的父类(包括数组)
 *      如果一个类在定义时,没有明确使用extents关键字说明它的直接父类
 *          那么它的直接父类就是Object,这是一个隐式的继承,没有必要写出来.
 *      如果一个类在定义时,明确使用了extents关键字说明了它的直接父类(不是Object类)
 *          那么它的间接父类中,最终肯定有一个类直接继承Object
 *          那么Object就是它的间接父类
 *
 * @since 10:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Class 'Demo' explicitly extends 'java.lang.Object'
public class Demo extends Object {
    public static void main(String[] args) {
        Grandson gs = new Grandson();
        gs.testGrandfather();

        // 问题: 创建Grandson对象,然后使用不同的引用接收,在本案例中的所有类中,可以有几种方式呢?
        Son s = new Grandson();
        Father f = new Grandson();
        Grandfather gf = new Grandson();

        Grandfather gf2 = s;
        Grandson gs2 = (Grandson) gf;


        Uncle u = (Uncle) gf;

        // ((Uncle) f)

        // Uncle u2 = new Grandson();

        // Object是Java所有类(包括数组)的祖先类,父类,Object引用可以指向任何一个对象
        Object o = new Grandfather();
        Object o2 = new int[3];
    }
}

// 祖先类
// Cyclic inheritance involving 'com.cskaoyan.javase.oop2.encapsulate._1extends._4hierarchy.Grandfather'
class Grandfather {
    public void testGrandfather() {
    }
}

// Uncle类和Father,Son,Grandson都不是一条继承链当中的
// Uncle类和Grandfather是一条继承链当中
class Uncle extends Grandfather {

}

class Father extends Grandfather {
    public void testFather() {
    }
}


class Son extends Father {
    public void testSon() {
    }

}

class Grandson extends Son {
    public void testGrandson() {
    }
}

class Father2 {
}
// Class cannot extend multiple classes
// class Son extends Father,Father2{}